4580. ABCDEF

 

You are given a set S of integers between -30000 and 30000 (inclusive).

Find the total number of sextuples (a, b, c, d, e, f) : a, b, c, d, e, f Î S, d ≠ 0, that satisfy:

(a * b + c) / de = f

 

Input. The first line contains integer n (1 ≤ n ≤ 100), the size of a set S. Elements of S are given in the next n lines, one integer per line. Given numbers will be distinct.

 

Output. Output the total number of plausible sextuples.

 

Sample Input

Sample Output

2

2

3

4

 

 

РЕШЕНИЕ

сортировка

 

Анализ алгоритма

Перепишем равенство в виде a * b + c = (f + e) * d. Занесем в массив m1 все возможные значения выражения a * b + c (a, b, c Î S). Занесем в массив m2 все возможные значения выражения (f + e) * d (f, e, d Î S). Отсортируем массивы m1 и m2. Найдем общие числа в двух массивах. Пусть число x содержится в m1 p раз, а в m2 q раз. Тогда количество искомых шестерок следует увеличить на p * q.

 

Реализация алгоритма

 

#include <cstdio>

#include <algorithm>

#define N 200

using namespace std;

 

int i, j, k, n;

int s[101];

int a, b, c, d, e, f, g, res;

int pi, pj, qi, qj;

int m1[N*N*N+10], m2[N*N*N+10];

 

int main(void)

{

  scanf("%d",&n);

  for(i = 0; i < n; i++) scanf("%d",&s[i]);

  for(i = a = 0; a < n; a++)

  for(b = 0; b < n; b++)

  for(c = 0; c < n; c++)

    m1[i++] = s[a]*s[b]+s[c];

  sort(m1,m1+i);

 

  for(j = d = 0; d < n; d++)

  if (s[d] != 0)

    for(e = 0; e < n; e++)

    for(f = 0; f < n; f++)

      m2[j++] = s[d] * (s[e] + s[f]);

  sort(m2,m2+j);

 

  for(res = pi = pj = 0;;)

  {

    if (m1[pi] < m2[pj]) pi++; else

    if (m1[pi] > m2[pj]) pj++; else

    {

      qi = pi; qj = pj;

      while((m1[qi] == m1[pi]) && (qi < i)) qi++;

      while((m2[qj] == m2[pj]) && (qj < j)) qj++;

      res += (qi - pi) * (qj - pj);

      if ((qi == i) || (qj == j)) break;

      pi = qi; pj = qj;

    }

  }

 

  printf("%d\n",res);

  return 0;

}